package org.itboys.core.util;

import com.alibaba.fastjson.JSON;
import com.squareup.okhttp.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Map;

/**
 * 作者：zzq
 * 时间：2018/10/16
 * 描述：
 */
public class OkHttpUtil {
    protected Logger logger = LoggerFactory.getLogger(getClass());

    public static final MediaType JSON_MediaType = MediaType.parse("application/json; charset=utf-8");

    // RequestBody body = new FormBody.Builder().add("useName", "addd").add("pwd", "123").build();
    /**
     * post请求
     * @param url
     * @return param key=value&key1=value1
     */

    /**
     * post请求传递json
     *
     * @param url
     * @return map
     */
    public static Map<String, Object> doPostWithJson(String url, String json) {
        OkHttpClient client = new OkHttpClient();
        //创建一个RequestBody(参数1：数据类型 参数2传递的json串)
        System.out.println("-post请求传递URL-" + url);
        System.out.println("-post请求传递json参数-" + json);
        RequestBody requestBody = RequestBody.create(JSON_MediaType, json);
        Request request = new Request.Builder()
                .url(url)
                .post(requestBody)
                .build();
        try {
            Response response = client.newCall(request).execute();
            /**
             * 我们在调试的时候喜欢Log一下看看数据正不正常，我在使用HttpURLConnection  或者 HttpClient 获取Response时都是先Log看看然后再传输给其他函数去解析，没有出现这样的问题；但是在使用OKhttp时就不正常了，因为调用了一次response.body().string()，那么这个流就已经被关闭了。所以想要Log，又要解析的时候，解决的办法是
             暂存一下这个数据：String tempResponse =  response.body().string();然后使用这个暂存的数据tempResponse 。
             */
            String responseBody = response.body().string();
            //  return responseBody;
            // String responseBody_utf8 = URLEncoder.encode(responseBody, "UTF-8");
            System.out.println("-post请求传递json返回结果-" + responseBody);
            // Map<String,Object> result = JsonUtils.jsonToObject(Map.class,json);
            Map<String, Object> result = JSON.parseObject(responseBody, Map.class);
           /* System.out.println("-post请求传递MAP返回结果-"+result.size());
            for(String key:result.keySet()){
                System.out.println("-post请求返回Map,key=-"+key+",value="+result.get(key));
            }*/
            return result;

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * post请求传递json(增加该方法目前用于调用Iot接口)
     *
     * @param url
     * @return map
     */
    public static Map<String, Object> doPostWithJsonAndHeader(String url, String json, String headerKey, String headerValue) {
        OkHttpClient client = new OkHttpClient();
        //创建一个RequestBody(参数1：数据类型 参数2传递的json串)
        System.out.println("-post请求传递URL-" + url);
        System.out.println("-post请求传递json参数-" + json);
        RequestBody requestBody = RequestBody.create(JSON_MediaType, json);
        Request request = new Request.Builder()
                .url(url)
                .header(headerKey, headerValue)
                .post(requestBody)
                .build();
        try {
            Response response = client.newCall(request).execute();
            /**
             * 我们在调试的时候喜欢Log一下看看数据正不正常，我在使用HttpURLConnection  或者 HttpClient 获取Response时都是先Log看看然后再传输给其他函数去解析，没有出现这样的问题；但是在使用OKhttp时就不正常了，因为调用了一次response.body().string()，那么这个流就已经被关闭了。所以想要Log，又要解析的时候，解决的办法是
             暂存一下这个数据：String tempResponse =  response.body().string();然后使用这个暂存的数据tempResponse 。
             */
            String responseBody = response.body().string();
            //  return responseBody;
            // String responseBody_utf8 = URLEncoder.encode(responseBody, "UTF-8");
            System.out.println("-post请求传递json返回结果-" + responseBody);
            // Map<String,Object> result = JsonUtils.jsonToObject(Map.class,json);
            Map<String, Object> result = JSON.parseObject(responseBody, Map.class);
           /* System.out.println("-post请求传递MAP返回结果-"+result.size());
            for(String key:result.keySet()){
                System.out.println("-post请求返回Map,key=-"+key+",value="+result.get(key));
            }*/
            return result;

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * get方式
     *
     * @param url
     * @return
     */
    public static Map<String, Object> doGet(String url) {
        OkHttpClient client = new OkHttpClient();
        //创建一个RequestBody(参数1：数据类型 参数2传递的json串)
        System.out.println("-get请求传递URL-" + url);

        Request request = new Request.Builder()
                .url(url)
                .build();
        try {
            Response response = client.newCall(request).execute();
            /**
             * 我们在调试的时候喜欢Log一下看看数据正不正常，我在使用HttpURLConnection  或者 HttpClient 获取Response时都是先Log看看然后再传输给其他函数去解析，没有出现这样的问题；但是在使用OKhttp时就不正常了，因为调用了一次response.body().string()，那么这个流就已经被关闭了。所以想要Log，又要解析的时候，解决的办法是
             暂存一下这个数据：String tempResponse =  response.body().string();然后使用这个暂存的数据tempResponse 。
             */
            String responseBody = response.body().string();
            //  return responseBody;
            // String responseBody_utf8 = URLEncoder.encode(responseBody, "UTF-8");
            System.out.println("-post请求传递json返回结果-" + responseBody);
            // Map<String,Object> result = JsonUtils.jsonToObject(Map.class,json);
            Map<String, Object> result = JSON.parseObject(responseBody, Map.class);
           /* System.out.println("-post请求传递MAP返回结果-"+result.size());
            for(String key:result.keySet()){
                System.out.println("-post请求返回Map,key=-"+key+",value="+result.get(key));
            }*/
            return result;

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static Map<String, Object> doGetWithHeader(String url, String appCode) {
        OkHttpClient client = new OkHttpClient();
        //创建一个RequestBody(参数1：数据类型 参数2传递的json串)
        System.out.println("get请求传递URL-" + url + "                 headerKey=" + appCode);

        Request request = new Request.Builder()
                .url(url)
                .header("Authorization", "APPCODE " + appCode)
                .build();
        try {
            Response response = client.newCall(request).execute();
            /**
             * 我们在调试的时候喜欢Log一下看看数据正不正常，我在使用HttpURLConnection  或者 HttpClient 获取Response时都是先Log看看然后再传输给其他函数去解析，没有出现这样的问题；但是在使用OKhttp时就不正常了，因为调用了一次response.body().string()，那么这个流就已经被关闭了。所以想要Log，又要解析的时候，解决的办法是
             暂存一下这个数据：String tempResponse =  response.body().string();然后使用这个暂存的数据tempResponse 。
             */
            String responseBody = response.body().string();
            //  return responseBody;
            // String responseBody_utf8 = URLEncoder.encode(responseBody, "UTF-8");
            System.out.println("-post请求传递json返回结果-" + responseBody);
            // Map<String,Object> result = JsonUtils.jsonToObject(Map.class,json);
            Map<String, Object> result = JSON.parseObject(responseBody, Map.class);
           /* System.out.println("-post请求传递MAP返回结果-"+result.size());
            for(String key:result.keySet()){
                System.out.println("-post请求返回Map,key=-"+key+",value="+result.get(key));
            }*/
            return result;

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * @param
     * @return
     * @description 带header的get请求
     * 该方法用于获取Iot resp返回的数据,返回格式为String
     * @author feihao
     * @date 2018-07-25 15:36
     */
    public static String doGetWithHeaderKV(String url, String headerKey, String headerValue) {
        OkHttpClient client = new OkHttpClient();
        //创建一个RequestBody(参数1：数据类型 参数2传递的json串)
        System.out.println("get请求传递URL-" + url + "                 headerKey=" + headerKey
                + "                 headerValue=" + headerValue);

        Request request = new Request.Builder()
                .url(url)
                .header(headerKey, headerValue)
                .build();
        try {
            Response response = client.newCall(request).execute();
            /**
             * 我们在调试的时候喜欢Log一下看看数据正不正常，我在使用HttpURLConnection  或者 HttpClient 获取Response时都是先Log看看然后再传输给其他函数去解析，没有出现这样的问题；但是在使用OKhttp时就不正常了，因为调用了一次response.body().string()，那么这个流就已经被关闭了。所以想要Log，又要解析的时候，解决的办法是
             暂存一下这个数据：String tempResponse =  response.body().string();然后使用这个暂存的数据tempResponse 。
             */
            String responseBody = response.body().string();
            //  return responseBody;
            // String responseBody_utf8 = URLEncoder.encode(responseBody, "UTF-8");
            System.out.println("-post请求传递json返回结果-" + responseBody);
            // Map<String,Object> result = JsonUtils.jsonToObject(Map.class,json);
            return responseBody;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}
